package syf.recursion;

public class Queen8 {
    private static final int max=8;//皇后的个数
    private static final int[]arr=new int[max];//一维数组表示二维数组 arr[0]=1 表示第0行1列
    public static void main(String[] args) {
        deploy(0);
    }
    /**
     * 摆放皇后
     * @param n 从第n个皇后开始摆 默认为0
     */
    private static void deploy(int n){
        if (n==max) {
            display();
            return;
        }
        for (int i=0;i<max;i++){
            arr[n]=i;
            if (judge(n))//不冲突
                deploy(n+1);
        }
    }
    /**
     *
     * @param n  当我们放置第n个皇后，就去检测该皇后是否已经和前面已经摆放的皇后冲突
     * @return 判断的值
     * arr[i]为列
     * i为行
     * 不能摆在同一列或者斜线上
     */
    private static boolean judge(int n){
        for (int i=0;i<n;i++){
            //arr[n]==arr[i] 表示在同一列上
            //Math.abs(n-i)==Math.abs(arr[n]-arr[i]) 表示在斜线上 Math.abs()为求绝对值
            if (arr[n]==arr[i]||Math.abs(n-i)==Math.abs(arr[n]-arr[i]))
                return false;
        }
        return true;
    }
    /**
     * 皇后摆放的位置输出
     */
    private static void display(){
        for (int x:arr)
            System.out.print(x);
        System.out.println();
    }
}
